From: kaf24@firebug.cl.cam.ac.uk Date: Fri, 30 Jun 2006 21:23:21 +0000 (+0100) Subject: [XEN] Sync Elf parsing with libxc parser. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~15912^2~2 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=273ffda5b4ce1926b9017e8b29bf8a584765a5c4;p=xen.git [XEN] Sync Elf parsing with libxc parser. Signed-off-by: Keir Fraser --- diff --git a/xen/common/elf.c b/xen/common/elf.c index 2e8969d915..950b13c407 100644 --- a/xen/common/elf.c +++ b/xen/common/elf.c @@ -95,7 +95,11 @@ int parseelfimage(struct domain_setup_info *dsi) elf_pa_off = elf_pa_off_defined ? simple_strtoul(p+17, &p, 0) : virt_base; if ( elf_pa_off_defined && !virt_base_defined ) - goto bad_image; + { + printk("ERROR: Neither ELF_PADDR_OFFSET nor VIRT_BASE found in" + " __xen_guest section.\n"); + return -EINVAL; + } for ( h = 0; h < ehdr->e_phnum; h++ ) { @@ -104,7 +108,11 @@ int parseelfimage(struct domain_setup_info *dsi) continue; vaddr = phdr->p_paddr - elf_pa_off + virt_base; if ( (vaddr + phdr->p_memsz) < vaddr ) - goto bad_image; + { + printk("ERROR: ELF program header %d is too large.\n", h); + return -EINVAL; + } + if ( vaddr < kernstart ) kernstart = vaddr; if ( (vaddr + phdr->p_memsz) > kernend ) @@ -127,7 +135,10 @@ int parseelfimage(struct domain_setup_info *dsi) (dsi->v_kernentry < kernstart) || (dsi->v_kernentry > kernend) || (dsi->v_start > kernstart) ) - goto bad_image; + { + printk("ERROR: ELF start or entries are out of bounds.\n"); + return -EINVAL; + } if ( (p = strstr(guestinfo, "BSD_SYMTAB")) != NULL ) dsi->load_symtab = 1; @@ -139,10 +150,6 @@ int parseelfimage(struct domain_setup_info *dsi) loadelfsymtab(dsi, 0); return 0; - - bad_image: - printk("Malformed ELF image.\n"); - return -EINVAL; } int loadelfimage(struct domain_setup_info *dsi)